/**
 * 防反跳、防抖动：只有当连续事件停止后的一小段时间后再触发一次，连续事件结束后可能只触发一次
 * @param fn 要执行的函数
 * @param delay 延迟毫秒数
 * @returns {(function(): void)|*}
 */

function debounce(fn, delay = 100) {
    let timer;
    return function () {
        const context = this;
        const args = arguments;
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            fn.apply(context, args);
        }, delay)
    }
}

/**
 * 节流：会在连续事件的过程中，每隔一段时间至少触发一次，连续事件结束后触发不止一次。
 * @param fn 要执行的函数
 * @param delay 间隔时间
 * @returns {(function(): void)|*}
 */
function throttle(fn, delay) {
    let lastTime = 0;
    return function () {
        const _this = this;
        const args = arguments;
        const currentTime = Date.now();
        if (currentTime - lastTime > delay) {
            fn.apply(_this, args);
            lastTime = currentTime
        }
    }
}

export default {debounce, throttle}